package example.data;

import java.io.IOException;

/**
 * Created by lenovo on 2016/11/7 0007.
 * 使用压栈出栈的方式，自定义字符串反转方法
 */
public class DefineReverse {
    private String input;//输入的字符串

    /**
     * 构造函数，接收输入的字符串
     * @param in String
     */
    private DefineReverse(String in) {
        input = in;
    }

    /**
     * 自定义的反转字符串的方法
     * @return 反转后的字符串
     */
    private String doRev() {
        //输入字符串的长度，作为栈的大小
        int stackSize = input.length();
        //建立栈对象
        Stack theStack = new Stack(stackSize);
        //依次将字符串的char压入栈中
        for (int i = 0; i < input.length(); i++) {
            char ch = input.charAt(i);
            theStack.push(ch);
        }
        //输出字符
        String output = "";
        while (!theStack.isEmpty()) {
            char ch = theStack.pop();
            output = output + ch;
        }
        return output;
    }
    //main函数
    public static void main(String[] args)
            throws IOException {
        String input = "www.w3cschool.cc";
        String output;
        DefineReverse theReverser =
                new DefineReverse(input);
        output = theReverser.doRev();
        System.out.println("反转前： " + input);
        System.out.println("反转后： " + output);
    }

    /**
     * 自定义内部类，栈
     */
    private class Stack {
        private int maxSize;//栈大小
        private char[] stackArray;//字符数组
        private int top;//顶端位置

        /**
         * 构造函数，初始化栈对象的基本属性参数
         * @param max 栈的大小
         */
        Stack(int max) {
            maxSize = max;
            stackArray = new char[maxSize];
            top = -1;
        }

        /**
         * 加入字符
         * @param j 字符
         */
        void push(char j) {
            stackArray[++top] = j;
        }

        /**
         * 移除最顶端的字符
         * @return 返回顶端的char字符
         */
        char pop() {
            return stackArray[top--];
        }

        /**
         * 查看顶端的字符，而不移除
         * @return 顶端字符，
         */
        public char peek() {
            return stackArray[top];
        }

        /**
         * 判断栈是否为空
         * @return 返回栈的空否状态
         */
        boolean isEmpty() {
            return (top == -1);
        }
    }
}
